#ifndef _THREAD_HPP__
#define _THREAD_HPP__
#include<functional>
#include<pthread.h>
#include<string>
#include <sys/types.h>
#include <unistd.h>
namespace ThreadModule
{
    enum class STATUS
    {
        NEW,
        RUNNING,
        STOP
    };

    
    class Thread
    {
        static void* Routine(void* args)//线程创建要的是一个参数的函数，而成员函数有this指针
        {
            Thread* t=reinterpret_cast<Thread*>(args);
            t->_status=STATUS::RUNNING;
            t->_func(t->Name());
            return nullptr;
        }

        static int _number;//类域对于静态成员变量只是有个类域限制，得在类外定义，这只是个声明，初始化列表与不会有他
        using func_t=std::function<void(std::string&)>;//function类中可能有函数指针，这就是这个类型为什么可以接收可调用对象，这个接收本质是构造function对象
    public:
        Thread(func_t func)//这里传参可调用对象，先构造func，再拷贝构造_func
        :_func(func)
        ,_pid(getpid())
        ,_joinable(true)
        ,_status(STATUS::NEW)
        {
            _name="Thread-"+std::to_string(_number++);
        }

        bool Start()
        {
            if(_status!=STATUS::RUNNING)
            {
                ::pthread_create(&_tid,nullptr,Routine,this);
                return true;
            }
            return false;
        }

        bool Stop()
        {
            if(_status==STATUS::RUNNING)
            {
                pthread_cancel(_tid);
                return true;
            }
            return false;
        }

        bool Join()
        {
            if(_joinable)
            {
                ::pthread_join(_tid,nullptr);//线程执行方法返回值void*，第二个参数传参void**正是来获取
                _status=STATUS::STOP;
                return true;
            }
            return false;

        }

        void Detach()//不关心线程返回值，直接分离，线程结束直接释放资源
        {
            _joinable=false;
            pthread_detach(_tid);
        }

        bool IsJoinable()
        {
            return _joinable;
        }

        std::string& Name()
        {
            return _name;
        }



    private:
        std::string _name;
        pthread_t _tid;//tid在创建线程时才能得到，这个是管理线程的对象，并不用非得构造时得到
        pid_t _pid;
        bool _joinable;
        func_t _func;
        STATUS _status;


    };

     int Thread::_number=0;//静态成员变量定义：去static加类域

}



#endif